/*
 * libPaquetes.h
 *
 *  Created on: 22/04/2012
 *      Author: utnso
 */

#ifndef LIBPAQUETES_H_
#define LIBPAQUETES_H_

//INCLUDES
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
//#include <fuse.h>
#include "libMat.h"

//CONSTANTES

#define TIPO_HANDSHAKE 0
#define TIPO_CREAR_ARCHIVO 1
#define TIPO_ABRIR_ARCHIVO 2
#define TIPO_LEER_ARCHIVO 3
#define TIPO_ESCRIBIR_ARCHIVO 4
#define TIPO_BORRAR_ARCHIVO 5
#define TIPO_TRUNCAR_ARCHIVO 6
#define TIPO_CERRAR_ARCHIVO 7
#define TIPO_CREAR_DIRECTORIO 8
#define TIPO_LEER_DIRECTORIO 9
#define TIPO_BORRAR_DIRECTORIO 10
#define TIPO_OBTENER_ATRIBUTOS 11
#define TIPO_RENOMBRAR 12
#define TIPO_BORRAR_EN_CACHE 13
#define TIPO_ERROR 14

//ACLARACIONES
	/*
	 * LOS PAQUETES NO FINALIZAN EN \0
	 * PAYLOAD: LONG_VAR1 VAR1 LONG_VAR2 VAR2...
	 * EL LONG_VAR ES DE 8 BYTES
	 */
//TIPO
typedef struct paquete_t{
	uint8_t tipo;
	uint16_t pLength;
	char* payload;
} __attribute__((packed)) paquete_t;

typedef struct argCrearArch_t{
	char* path;
	mode_t modo;
	//struct fuse_file_info* fInfo; //¿se necesita?
} __attribute__((packed)) argCrearArch_t;

typedef struct argAbrirArch_t{
	char* path;
	//struct fuse_file_info* fInfo;//¿se necesita?
} __attribute__((packed)) argAbrirArch_t;

typedef struct argLeerArch_t{
	char* path;
	size_t size;
	off_t offset;
	//struct fuse_file_info* fInfo; //¿se necesita?
} __attribute__((packed)) argLeerArch_t;

typedef struct argEscribirArch_t{
	char* path;
	char* buffer;
	size_t size;
	off_t offset;
	//struct fuse_file_info* fInfo; //¿se necesita?
} __attribute__((packed)) argEscribirArch_t;

typedef struct argBorrarArch_t{
	char* path;
} __attribute__((packed)) argBorrarArch_t;

typedef struct argTruncarArch_t{
	char* path;
	off_t offset;
	//struct fuse_file_info* fInfo; //¿se necesita?
} __attribute__((packed)) argTruncarArch_t;

typedef struct argCerrarArch_t{
	char* path;
	//struct fuse_file_info* fInfo; //¿se necesita?
} __attribute__((packed)) argCerrarArch_t;

typedef struct argCrearDir_t{
	char* path;
	mode_t modo;
} __attribute__((packed)) argCrearDir_t;

typedef struct argLeerDir_t{
	char* path;
	off_t offset;
	//struct fuse_file_info* fInfo; //¿se necesita?
} __attribute__((packed)) argLeerDir_t;

typedef struct argBorrarDir_t{
	char* path;
} __attribute__((packed)) argBorrarDir_t;

typedef struct argGetAttr_t{
	char* path;
} __attribute__((packed)) argGetAttr_t;

/*typedef struct argRenombrar_t{
	char* pathViejo;
	char* pathNuevo;
} __attribute__((packed)) argRenombrar_t;*/

typedef struct reciboConBuffer_t{
	int32_t resultado;
	uint64_t tamanio;
	char* buffer;
} __attribute__((packed)) reciboConBuffer_t;

typedef struct reciboConAtributos_t{
	int32_t resultado;
	mode_t mode;
	off_t size;
} __attribute__((packed)) reciboConAtributos_t;

//FUNCIONES

char* serializar(paquete_t paquete);

paquete_t deserializar(char* buffer);


uint32_t tamanioEnvioCrearArchivo(argCrearArch_t);

argCrearArch_t parsearEnvioCrearArchivo(char* payload);

char* desparsearEnvioCrearArchivo(argCrearArch_t arg);


uint32_t tamanioEnvioAbrirArchivo(argAbrirArch_t);

argAbrirArch_t parsearEnvioAbrirArchivo(char* payload);

char* desparsearEnvioAbrirArchivo(argAbrirArch_t arg);


uint32_t tamanioEnvioLeerArchivo(argLeerArch_t);

argLeerArch_t parsearEnvioLeerArchivo(char* payload);

char* desparsearEnvioLeerArchivo(argLeerArch_t arg);


uint32_t tamanioEnvioEscribirArchivo(argEscribirArch_t);

argEscribirArch_t parsearEnvioEscribirArchivo(char* payload);

char* desparsearEnvioEscribirArchivo(argEscribirArch_t arg);


uint32_t tamanioEnvioBorrarArchivo(argBorrarArch_t);

argBorrarArch_t parsearEnvioBorrarArchivo(char* payload);

char* desparsearEnvioBorrarArchivo(argBorrarArch_t arg);


uint32_t tamanioEnvioTruncarArchivo(argTruncarArch_t);

argTruncarArch_t parsearEnvioTruncarArchivo(char* payload);

char* desparsearEnvioTruncarArchivo(argTruncarArch_t arg);


uint32_t tamanioEnvioCerrarArchivo(argCerrarArch_t);

argCerrarArch_t parsearEnvioCerrarArchivo(char* payload);

char* desparsearEnvioCerrarArchivo(argCerrarArch_t arg);


uint32_t tamanioEnvioCrearDirectorio(argCrearDir_t);

argCrearDir_t parsearEnvioCrearDirectorio(char* payload);

char* desparsearEnvioCrearDirectorio(argCrearDir_t arg);


uint32_t tamanioEnvioLeerDirectorio(argLeerDir_t);

argLeerDir_t parsearEnvioLeerDirectorio(char* payload);

char* desparsearEnvioLeerDirectorio(argLeerDir_t arg);


uint32_t tamanioEnvioBorrarDirectorio(argBorrarDir_t);

argBorrarDir_t parsearEnvioBorrarDirectorio(char* payload);

char* desparsearEnvioBorrarDirectorio(argBorrarDir_t arg);


uint32_t tamanioEnvioObtenerAtributos(argGetAttr_t);

argGetAttr_t parsearEnvioObtenerAtributos(char* payload);

char* desparsearEnvioObtenerAtributos(argGetAttr_t arg);


//uint32_t tamanioEnvioRenombrar(argRenombrar_t);

//argRenombrar_t parsearEnvioRenombrar(char* payload);

//char* desparsearEnvioRenombrar(argRenombrar_t arg);


int32_t parsearReciboSinBuffer(char* payload);

char* desparsearReciboSinBuffer(int32_t resultado);

reciboConBuffer_t parsearReciboConBuffer(char* payload);

uint16_t tamanioReciboConAtributos(int32_t, mode_t, size_t);

reciboConAtributos_t parsearReciboConAtributos(char* payload);

char* desparsearReciboConAtributos(int32_t, mode_t, size_t);

#endif /* LIBPAQUETES_H_ */
